﻿using MachineVision.Shared.Services;
using MachineVision.Shared.Services.Tables;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MachineVision.Services
{
    public class SettingService : BaseService, ISettingService
    {
        //读取设置
        public async Task<Setting> GetSettingAsync()
        {
            //使用Sqlite.Select<Setting>().FirstAsync()从数据库中查询第一条Setting记录，并将查询结果赋值给变量setting。
            var setting = await Sqlite.Select<Setting>().FirstAsync();

            //如果查询结果为空，说明数据库中没有任何Setting记录，此时它会调用InserDefaultSettingAsync方法插入默认设置，并递归调用GetSettingAsync方法再次尝试获取设置记录。
            if (setting == null)
            {
                await InserDefaultSettingAsync();
                return await GetSettingAsync();
            }

            //如果查询结果非空，即数据库中已存在设置记录，方法直接返回这个Setting实例。
            return setting;
        }

        //保存传入的Setting实体到数据库。
        public async Task SaveSetting(Setting input)
        {
            //查询数据库中是否存在具有相同Id的Setting记录。
            var setting = await Sqlite.Select<Setting>().FirstAsync(t => t.Id.Equals(input.Id));
            if (setting == null)
            {
                //如果没有找到对应的记录（setting == null），说明这是一个新的设置，应该将其插入到数据库中。使用Sqlite.Insert(input).ExecuteAffrowsAsync()方法插入新记录。
                await Sqlite.Insert(input).ExecuteAffrowsAsync();
            }
            else
            {
                //如果找到了对应的记录，说明需要更新现有的设置。
                //使用Sqlite.Update<Setting>()链式调用设置更新内容和条件，SetDto(input)表示使用传入的input对象作为更新数据源，Where(q => q.Id == input.Id)指定更新条件为具有相同Id的记录，最后调用ExecuteAffrowsAsync()执行更新操作。
                await Sqlite.Update<Setting>()
                            .SetDto(input)
                            .Where(q => q.Id == input.Id)
                            .ExecuteAffrowsAsync();
            }
        }

        private async Task InserDefaultSettingAsync()
        {
            //直接创建一个新的Setting实例，设置预定义的语言和皮肤，然后使用Sqlite.Insert(..).ExecuteAffrowsAsync()将其插入数据库
            await Sqlite.Insert(new Setting()
            {
                Language = "zh-CN",
                SkinName = "Light",
            }).ExecuteAffrowsAsync();
        }
    }
}
